#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>

const int N = 1e4 + 5, K = 21, M = 1e2 + 5, inf = 0x3f3f3f3f;
int n, k, m, dis[K][N], b[M], f[1 << K];
bool a[N], diff[N], vis[N];
std::queue<int> q;
std::vector<int> vec;
int e_cnt, heads[N];

struct Edge {
  int v, nxt, w;
} e[(K * K) << 1];

inline void add(int u, int v, int w) {
  e[++e_cnt].v = v, e[e_cnt].nxt = heads[u], heads[u] = e_cnt, e[e_cnt].w = w;
}

inline void bfs(int s, int (&dis)[N]) {
  memset(vis, 0, sizeof(vis));
  memset(dis, inf, sizeof(dis));
  dis[s] = 0;
  q.push(s);
  vis[s] = true;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int j = 1, tar; j <= m; ++j) {
      tar = u + b[j];
      if (tar <= n && dis[tar] > dis[u] + 1) {
        dis[tar] = dis[u] + 1;
        if (!vis[tar]) {
          q.push(tar);
          vis[tar] = true;
        }
      }
      tar = u - b[j];
      if (tar > 0 && dis[tar] > dis[u] + 1) {
        dis[tar] = dis[u] + 1;
        if (!vis[tar]) {
          q.push(tar);
          vis[tar] = true;
        }
      }
    }
  }
}

inline void solve() {
  memset(f, inf, sizeof(f));
  memset(vis, 0, sizeof(vis));
  f[0] = 0, vis[0] = true;
  q.push(0);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (size_t i = 0, sta; i < vec.size(); ++i)
      for (int j = heads[i]; j; j = e[j].nxt)
        if (((u & (1 << i)) == 0) || ((u & (1 << e[j].v)) == 0)) {
          sta = u ^ (1 << i) ^ (1 << e[j].v);
          if (f[sta] > f[u] + e[j].w) {
            f[sta] = f[u] + e[j].w;
            if (!vis[sta]) vis[sta] = true, q.push(sta);
          }
        }
  }
}

int main() {
#ifndef ONLINE_JUDGE
#ifdef LOCAL
  freopen("testdata.in", "r", stdin);
  freopen("testdata.out", "w", stdout);
#else
  freopen("CF79D Password.in", "r", stdin);
  freopen("CF79D Password.out", "w", stdout);
#endif
#endif

  scanf("%d%d%d", &n, &k, &m);
  for (int i = 1, p; i <= k; ++i) {
    scanf("%d", &p);
    a[p] = true;
  }
  ++n;
  for (int i = 1; i <= n; ++i) diff[i] = a[i - 1] ^ a[i];
  for (int i = 1; i <= n; ++i)
    if (diff[i] == true) vec.push_back(i);
  for (int i = 1; i <= m; ++i) scanf("%d", &b[i]);
  for (std::vector<int>::iterator i = vec.begin(); i != vec.end(); ++i) {
    bfs(*i, dis[i - vec.begin()]);
  }
  for (size_t i = 0; i < vec.size(); ++i) {
    for (size_t j = i + 1; j < vec.size(); ++j) {
      int minn = inf;
      for (int h = 1; h <= n; ++h) minn = std::min(minn, dis[i][h] + dis[j][h]);
      if (minn != inf) add(i, j, minn), add(j, i, minn);
    }
  }
  solve();
  if (f[(1 << vec.size()) - 1] == inf) puts("-1");
  else
    printf("%d", f[(1 << vec.size()) - 1]);
  return 0;
}